package main

import "fmt"

// 题目： 类型 数字
//给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转
//注意:
//假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为[−231, 231−1]。请根据这个假设，如果反转后整数溢出那么就返回0。

//笔记： 这一题不推荐使用字符串来解决
func reverse(x int32) int32 {

	var rec int32
	// overflow := false
	if x > 0 {
		for ; x != 0 ; {
			tmp := x % 10 // 获取余数
			x = x / 10
			//难点是 + 这一步操作会导致：所谓的 溢出的，必须保证
			//各个部分在一定的范围内的
			if rec > int32(^uint32(0)>>1)/10 || (rec == int32(^uint32(0)>>1)/10 && tmp > 7) {
                return 0
			}
			rec = rec*10 + tmp
		}
	}else{
		for ; x != 0 ;{
			tmp := x % 10
			x = x / 10
			// 整形数组的 最大值和最小值 的表示
			// 溢出条件的判断
			if rec < ^int32(^uint32(0)>>1) / 10  ||(rec ==  ^int32(^uint32(0)>>1) / 10 && tmp < -8)    {  // 8 是 -2^31 的个位数 ,在计算机中越小的数，需要越大的表示 ;
				// overflow =true‘’
                return 0
			}
			rec = rec * 10 + tmp
		}
	}
	return rec
}
// 笔记
// 难点 在与 溢出条件 的判断
// 在 +-  条件下，关于溢出条件的处理

func main(){
	//reverse(321)
	fmt.Println(reverse(321))
}
